home *** CD-ROM | disk | FTP | other *** search
- *cX Curso de assembler (IV)
-
- *cR Vamos a continuar en esta nueva entrega con
- algo más fuertecillo... después de presentar
- el A86 (incluido en este número), daremos un
- profundo repaso a las principales interrup-
- ciones para luego poder iniciar proyectos más
- complejos. Pero empezemos corrigiendo los
- programitas que puse el pasado dia:
-
- *c7 MOV AX, 100 *c1 ; AX=100
- *c7 MOV BX, 200 *c1 ; BX=200
- *c7 ADD AX, BX *c1 ; AX=300
- *c7 MUL BX *c1 ; DX:AX=200*300=60000
- *cR
- Este era un ejemplo muy sencillo que no
- tenia ningún tipo de error ni complicación
- más allá de lo normal. El próximo os ha dado
- problemas a alguno pues lo intentasteis
- compilar y no os dejó:
-
- *c7 MOV AX, 30 *c1 ; AX=30
- *c7 MOV BX, 10 *c1 ; BX=10
- *c7 MUL BX *c1 ; DX:AX=30*10=300
- *c7 DIV BX *c1 ; DX=0 AX=30
- *c7 ADD AL, BX *c1 ; ERROR!!!
- *cR
- La última instrucción da un error de compi-
- lación ya que no se puede sumar un número de
- 8 bits con otro de 16. El último de los
- problemitas tampoco se podia compilar por
- varios errores:
-
- *c7 MOV AL, 500 *c1 ; ERROR!!!
- *c7 MOV BL, 100 *c1 ; BL=100
- *c7 SUB AL, BL *c1 ; AL=AL-100
- *c7 MUL 10 *c1 ; ERROR!!!
- *cR
- En la primera línea ya nos encontramos un
- error bastante gordo, pero muy frequente al
- principio que consiste en tratar de meter en
- un registro de 8 bits (en este caso) un valor
- de más bits (al menos 9 para el 500). La
- solución seria usar AX que puede representar
- hasta 16 bits. El otro error que aparece es
- la multiplicación que se intenta hacer en la
- última línea y que es ilegal ya que no pode-
- mos multiplicar por un valor constante.
-
- *cV El ensamblador A86
- *cR
- El A86 es un ensamblador shareware que nos
- permitirá crear código para el procesador
- 8086 que es el que estamos "estudiando" aquí.
- No se trata de un ensamblador completísimo,
- con miles de opciones para hacer virguerias,
- es un programita de lo más simple en el mundo
- de los ensambladores, pero esa simplicidad,
- lejos de hacerlo inferior, provoca que se use
- siempre que se desee hacer un programita
- rápido.
- Lo usaremos durante unos meses ya que
- durante la fase de aprendizaje es mejor
- dejarse de complicaciones, por lo que seria
- recomendable que si dominas el inglés te leas
- los manuales que, por cierto, llevan un curso
- básico de assembler. Tambien deberias de
- registrarte si te gusta y lo vas a usar,
- aunque yo no creo que lo hagas... como todos.
- :)
- Vamos con la sintáxis. ¿Recordais los
- programitas de antes? Pues podeis
- probar a teclearlos y ensamblarlos... no hace
- falta que le digais nada más, el assembler lo
- ha sobre-entendido todo. Como ejemplo he
- metido un archivo llamado '*cCaritmet1.asm*cR' en
- el directorio '*cAASM*cR' que podeis compilar y
- luego debuggear con el própio 'debug' del
- DOS.
- Como podreis observar, el A86 es tan simple
- que consta de un sólo ejecutable que podeis
- incluso (por su reducido tamaño) copiar al
- directorio del *cADOS*cR o si no lo preferiis poner
- en la variable *cAPATH*cR del sistema la ruta hasta
- donde se encuentra dicho fichero. Además del
- A86, existe un debugger llamado D86 y creado
- por la misma persona que lee los
- ficheros *cA.SYM*cR generados y nos ayuda a debuggear
- (tal vez en próximos números se incluya el
- *cAD86*cR).
- Los comentarios en el *cAA86*cR, como en todos
- los ensambladores, consisten en un punto y
- coma y de ahí a final de línea es ignorado.
- Hay unas cuantas directivas para el ensambla-
- dor que no veremos si no nos son necesarias y
- de las que podreis ver una referencia en
- los *cA.DOC*cR que se adjuntan. Otra cosita bastan-
- te simple del *cA A86 *cRson las etiquetas, una
- etiqueta es cualquier secuencia de caracteres
- válida acabada en ':' (dos puntos). Un ejem-
- plo de uso de etiquetas lo podeis ver en
- *cCaritmet2.asm*cR que es un ejemplo algo más
- complejo que estudiaremos ahora enseguida.
-
- *cV Instrucciones de bifurcación
- *cR
- Tras ese pomposo nombre se esconden ni más
- ni menos que los saltos que se producen
- durante la ejecución del programa. Está
- clarísimo que no se puede programar de forma
- lineal y por tanto el procesador ha de pro-
- porcionarnos una forma de hacer que el pro-
- grama siga su curso por otro camino que no
- sea la línea recta. Las causas de salto
- pueden ser: interrupciones (tanto software
- como hardware), llamadas a subrutinas, saltos
- condicionales y saltos incondicionales. Vamos
- a ver, por orden inverso, los saltitos:
- Los saltos incondicionales son los que
- produce el programador para cambiar la ejecu-
- ción del programa a otro punto por la razón
- que sea. La instrucción que se encarga de
- hacerlo es JMP que es el acrónimo de JUMP
- (salto). Vamos con el ejemplo:
-
- *c7 MOV AX, 100 *c1 [1]
- *c7 MOV BX, 200 *c1 [2]
- *c7 JMP Suma *c1 [3]
- *c7 Fin: *c1 [4] *i%
- *c7 MOV AX,4C00h *c1 [5]
- *c7 INT 21h *c1 [6]
- *c7 Suma: *c1 [7]
- *c7 ADD AX, BX *c1 [8]
- *c7 JMP Fin *c1 [9]
- *cR
- Este sencillísimo código lo que hace es
- primero guardar 2 valores inmediatos en AX y
- BX (lineas 1 y 2), luego saltar con la ins-
- trucción JMP a la etiqueta *cCSuma*cR que se
- encuentra en la línea 7, se suman los números
- y se salta a la línea 4 donde se ejecutan las
- 2 líneas que terminan la ejecución de los
- programas.
- Como podrás ver, la instrucción JMP es el
- GOTO de Basic, C, Pascal y tantos lenguajes
- de alto nivel que siempre nos prohibieron
- usar (pero que aquí es lo único que se puede
- emplear para determinadas cosas).
- Los saltos condicionales son un tipo espe-
- cial de salto que se ejecutan según el estado
- que la anterior instrucción haya dejado en el
- registro de flags o banderas. Antes de nada,
- el registro de estado (de flags o como te de
- la gana), es un registro que no se debe
- modificar y que guarda información de la
- ejecución de la última instrucción, bueno, no
- exactamente la última, la última que haya
- modificado el registro de estado, es decir,
- algunas lo modifican y otras no (en general
- lo modifican las que pasan pasan por la ALU,
- las aritméticas). Este registro guarda infor-
- mación sobre como si, por ejemplo, los dos
- registros implicados en una resta han dado
- resultado cero, o negativo, etc. Bueno,
- veamos un ejemplo y luego sigo:
-
- *c7 MOV AX, 40 *c1 [ 1]
- *c7 MOV BX, 20 *c1 [ 2]
- *c7 SUB AX, BX *c1 [ 3]
- *c7 JZ Fin *c1 [ 4]
- *c7 SUB AX, BX *c1 [ 5]
- *c7 JZ Fin2 *c1 [ 6] *i&
- *c7 Fin: *c1 [ 7]
- *c7 MOV AX, 4C00h *c1 [ 8]
- *c7 INT 21h *c1 [ 9]
- *c7 Fin2: *c1 [10]
- *c7 JMP Fin *c1 [11]
- *cR
- En el ejemplo lo primero que se hace es
- poner en AX y BX los valores iniciales, luego
- se hace la resta AX-BX que da como resultado
- AX=40-20=20 y en el registro de estado se
- pone el bit correspondiente como que el
- resultado NO es cero. En la línea 4 aparece
- la primera línea de salto condicional que
- viene a decir aproximadamente "si el resulta
- do de la operación *cASUB AX,BX*cR era 0, entoces
- saltar a *cBFin*cR, en otro caso, continuar por
- la siguiente línea (5)". Como el resultado
- no habia dado 0, no se salta y se continua
- con la ejecución de la línea 5 que es otra
- resta, pero que en esta ocasión, sí resulta
- ser cero. La línea 6 es análoga a la 4, pero
- resulta que la anterior instrucción sí habia
- dado como resultado 0 y por tanto habrá que
- saltar a la etiqueta *cBFin2*cR. La etiqueta
- *cBFin2*cR nos lleva a la instrucción *cBJMP Fin*cR
- que salta incondicionalmente a la línea 7
- donde se termina el programa con las típicas
- intrucciones.
- Muchas veces, nos interesará saltar si 2
- registros son iguales, pero no querremos
- perder el contenido de uno de ellos, para
- esto hay una instrucción que es CMP
- y que es el acrónimo de *cACOMPARE*cR. Básicamente
- lo que hace es restar los 2 registros que se
- indiquen, pero sin escribir el resultado en
- el destino. Como te podrás imaginar, para
- saber si los 2 registros son iguales, hay que
- mirar si despues de restarlos el resultado es
- 0 (con el bit de cero del registro de flags).
- La lista completa de instrucciones de salto
- condicional ya las veremos, pero las más
- importantes son (aunque algunas como JZ y JE
- sean iguales):
-
- *c2 JZ *c3 -> *c4 si cero
- *c2 JE *c3 -> *c4 si iguales
- *c2 JC *c3 -> *c4 si lleva acarreo
- *c2 JB *c3 -> *c4 si menor que
- *c2 JA *c3 -> *c4 si mayor que
- *c2 JS *c3 -> *c4 si es negativo
- *cR
- *c6 NOTA: *cRSe puede intercalar la letra 'N' para
- indicar negación, por ejemplo, *cTJE*cR salta si
- son iguales y *cTJNE*cR salta si no son iguales.
- Las llamadas a subrutinas son el tercer
- tipo de salto que veremos. Se usa la instruc-
- ción *cTCALL *cR(llamar) seguida por una etiqueta y
- es equivalente a la instrucción de BASIC (o
- otros lenguajes lineales) GOSUB. Lo que se
- hace internamente es muy importante e intere-
- sante, pero no lo veremos hasta que sepamos
- que es la pila. En este número sólo veremos
- un ejemplo y dejaré para más adelante el
- estudio concienzudo de los subprogramas:
-
- *c7 MOV AX, 100 *c1 ; Inicializamos AX y BX
- *c7 MOV BX, 80 *c1 ; a un valor cualquiera.
- *c7 CALL Suma *c1 ; Llamamos a Suma.
- *c7 MOV AX, 4C00h*c1 ; En DX ahora tendremos la
- *c7 INT 21h *c1 ; suma de AX y BX.
- *c7 Suma:
- *c7 MOV DX, AX *c1 ; Subprograma para sumar 2
- *c7 ADD DX, BX *c1 ; números.
- *c7 RET *c1 ; Instrucción para regresar
- *cR
- El último tipo de bifurcaciones son las
- interrupciones. Básicamente se trata de
- subprogramas predefinidos a los que se llama
- para realizar una tarea en concreto (mostrar
- un mensaje, salir al DOS, etc). No me exten-
- deré más en esto ya que en el pasado número
- ya tuvisteis el primer contacto y más adelan-
- te tendreis otro contacto.
- Con estos saltos que habeis podido ver, el
- programador ya puede empezar a estructurar
- sus programas tal como lo hacia con los HLL y
- compactar aún más sus programas. Recomendaria
- que los programitas de ejemplo que he mostra-
- do, los compilarais y los ejecutarais paso a
- paso para ver por donde va el curso de ins-
- trucciones en cada momento.
-
- *cV Las principales interrupciones
- *cR
- Como hay muchas interrupciones para hacer
- muy variadas cosas, lo mejor es (bla, bla...)
- que consigais la lista de Ralf Brown o algo
- similar y busqueis la interrupción adecuada
- para lo que vayais a hacer. Por ejemplo, si
- necesitais abrir ficheros ymanejar su conte-
- nido, le deciis al programa que busque "open
- file" o algo por el estilo y encontrareis un
- servicio (*cA3Dh*cR) dentro de la *cBINT 21h*cR que os
- permitirá abrir ficheros. A partir de este,
- mirais los servicios asociados y encontrareis
- como cerrar el fichero (*cA3Eh*cR), como posicio-
- narte (*cA42h*cR), etc.
- Iba a hacer una lista de los mejores, pero
- como seguro que todos teneis o podeis conse-
- guir la lista esta de R.B. pues no lo he
- hecho. De todas formas si teneis problemas
- encontrandola o no os aclarais con alguna
- interrupción, no dudeis en preguntar. Para
- que tengais unos ejemplos más, os he incluido
- un sencillo código que lo que hace es decir
- si existe o no un fichero. Prueba a crear y
- eliminar el fichero y debuggea el programa
- para ver que hace en cada instante.
-
- Como el tiempo apremia por culpa de los
- malditos exámenes, no he podido hacer más
- ejemplos ni explicar las instrucciones lógi-
- cas, pero en el próximo número seguro que
- tendreis mucha más chicha que en este...
- practicad mucho y no seais malos (=no progra-
- meis en Visual Basic :)
-
- *cM Navi Dj.
-